package logic.service;

import dao.ContactDAO;
import dao.StudentDAO;
import entity.Contact;
import entity.Student;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import vo.ContactVO;
import vo.IValueObject;

/**
 *
 * @author Alexander
 */
public class ContactService implements IService {

    @Override
    public void persist(IValueObject vo, EntityManager em) {
        Contact entity = new Contact();
        entity.setId(((ContactVO) vo).getId());
        entity.setName(((ContactVO) vo).getName());
        entity.setLastName(((ContactVO) vo).getLastName());
        entity.setPhones(((ContactVO) vo).getPhones());
        entity.setEmail(((ContactVO) vo).getEmail());
        
        Student alumno = (Student) new StudentDAO().find(((ContactVO) vo).getStudentId(), em);
       
        entity.setStudent(alumno);
        
        //entity.setAgenda();

        new ContactDAO().persist(entity, em);
    }

    @Override
    public IValueObject find(Object id, EntityManager em) {
        Contact c = (Contact) new ContactDAO().find(id, em);
        if (c != null) {
            return c.toVo();
        } else {
            return null;
        }
    }

    @Override
    public void update(IValueObject vo, EntityManager em) {
        Contact entity = new Contact();
        entity.setId(((ContactVO) vo).getId());
        entity.setName(((ContactVO) vo).getName());
        entity.setLastName(((ContactVO) vo).getLastName());
        entity.setPhones(((ContactVO) vo).getPhones());
        entity.setStudent((Student)new StudentDAO().find(((ContactVO) vo).getStudentId(), em));
        entity.setEmail(((ContactVO) vo).getEmail());
        //entity.setAgenda();

        new ContactDAO().update(entity, em);
    }

    @Override
    public void delete(Object id, EntityManager em) {
        new ContactDAO().delete(id, em);
    }

    @Override
    public List<IValueObject> getList(EntityManager em) {
        List<IValueObject> contactVO = new ArrayList<>();
        for (Object contact : new ContactDAO().getList(em)) {
            contactVO.add(((Contact) contact).toVo());
        }
        return contactVO;
    }
    /**
     * Busca la lista de contactos de un usuario
     * @param user Usuario registrado
     * @param contact Nombre del contacto
     * @param em Manejador de la persistencia
     * @return Lista de contactos del usuario
     */
    public List<ContactVO> findByUser(String user, String contact, EntityManager em){
        Student student = (Student) new StudentDAO().find(user, em);
        
        List<Contact> list2 = new ArrayList<>();
        List<ContactVO> ret = new ArrayList<>();
        
        list2 = new ContactDAO().findByUser(student, contact, em);
        
        for(Contact c: list2){
            ret.add(c.toVo());
        }
        
        return ret;
    }
    
    /**
     * Busca la lista de telefonos de un contacto
     * @param user Usuario registrado
     * @param cont Contacto del usuario
     * @param em Manager de persistencia
     * @return Lista de telefonos de un contacto
     */
    public List<Double> phoneList(String user, String cont, EntityManager em){
        Student student = (Student) new StudentDAO().find(user, em);
                
        return new ContactDAO().phoneList(student, cont, em);
    }
    
    public IValueObject findContact(String user, String cont, EntityManager em){
        ContactVO con = null;
        Student st = (Student) new StudentDAO().find(user, em);
        
        con = ((Contact) new ContactDAO().findContact(st, cont, em)).toVo();
        
        return con;
    }
}
